/**
 * 
 */
package com.worksmap.core.task;

import com.taobao.api.internal.tmc.Message;
import com.taobao.api.internal.tmc.MessageHandler;
import com.taobao.api.internal.tmc.MessageStatus;
import com.taobao.api.internal.tmc.TmcClient;
import com.taobao.top.link.LinkException;
import com.worksmap.core.constant.RateConstant;

/**
 * @author jack
 *
 */
public class Test{
	
	public static void main(String[] args){
		new Test().testTopComet();
	}
	
	/**
	 * 淘宝会对每个message新建一个线程（线程池）
	 * 注：采用Java main方法在Eclipse里面运行上面的代码测试时，
	 * 请在client.connect()后面加上Thread.sleep让main线程等待一段时间结束，
	 * 以便观察消息的实时接收情况，否则main线程结束后，TMC长连接也会跟着断开。
	 * 如果是在web服务器上运行上面的代码，则不用在client.connect()后面加任何Thread.sleep代码，
	 * 也不需要在外面包一层while(true)循环，因为web服务器上的主线程只要服务器不关闭都是不会结束的，
	 * TMC的长连接会一直保持。
	 * 方法简介：
	 * jack
	 * 2013-12-26
	 */
	public void testTopComet(){
		TmcClient client = new TmcClient(RateConstant.appkey, RateConstant.appSecret);     //真实环境
//		TmcClient client = new TmcClient("ws://mc.api.tbsandbox.com/", 
//				RateConstant.appkey, RateConstant.appSecret, "default");  //沙箱
		client.setMessageHandler(new MessageHandler() {  
			/** 
		     * 消息服务客户端收到消息后，会回调该方法处理具体的业务，处理结果可以通过以下两种方式来表述： 
		     * <ul> 
		     * <li>抛出异常或设置status.fail()表明消息处理失败，需要消息服务端重发 
		     * <li>不抛出异常，也没有设置status信息，则表明消息处理成功，消息服务端不会再投递此消息 
		     * @param message 消息内容 
		     * @param status 处理结果，如果调用status.fail()，消息服务将会择机重发消息；否则，消息服务认为消息处理成功 
		     * @throws Exception 消息处理失败，消息服务将会择机重发消息 
		     */  
			@Override
		    public void onMessage(Message message, MessageStatus status) {  
		        try {  
		            System.out.println("message.getContent()" + message.getContent());  
		            System.out.println("message.getTopic()" + message.getTopic());
		            // 默认不抛出异常则认为消息处理成功  
		        } catch (Exception e) {  
		            e.printStackTrace();  
		            status.fail();// 消息处理失败回滚，服务端需要重发  
		        }  
		    }
		});  
		try {
			client.connect();
		} catch (LinkException e) {
			e.printStackTrace();
		}
		try {
			Thread.sleep(100000000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
